// /pages/orders/orders.js

// 导入全局 App 实例和我们创建的工具函数
const app = getApp();
import { formatRange, formatSingle } from '../../utils/formatters.js';


Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 顶部标签页的配置，apiUrl 指向后端对应的完整接口路径
    tabs: [
      
      { title: "预约订单", apiUrl: "/api/app/orders/me/bookings" },
      { title: "进行中", apiUrl: "/api/app/orders/me/ongoing" },
      { title: "全部订单", apiUrl: "/api/app/orders/me/history" },
    ],
    activeTab: 0,         // 当前激活的Tab索引
    
    // 三个列表的数据将统一存储在一个对象中，方便管理
    lists: {
      0: [], // 对应“预约订单”
      1: [], // 对应“进行中”
      2: [], // 对应“全部订单”
    },
    
    // 页面状态控制
    isLoading: false,       // 加载状态锁，防止在一次请求完成前发起新的请求
    isRefreshing: false,    // 控制 WXML 中下拉刷新动画的显示状态
  },

  // ==========================================================
  // =                      生命周期函数                       =
  // ==========================================================
  
  onLoad(options) {
    // 任务：接收外部页面传来的 tabIndex 参数，以决定初始显示的Tab
    if (options && options.tabIndex !== undefined) {
      const targetTabIndex = parseInt(options.tabIndex, 10);
      if (targetTabIndex >= 0 && targetTabIndex < this.data.tabs.length) {
        this.setData({ activeTab: targetTabIndex });
      }
    }
  },

  async onShow() {
    // 任务：使用登录守卫，并刷新当前Tab的数据
    const isLoggedIn = await app.ensureLoggedIn();
    if (!isLoggedIn) return;
    this.fetchDataForCurrentTab(); 
  },

  // ==========================================================
  // =                      网络请求核心                       =
  // ==========================================================

  /**
   * [网络流程] - 核心函数，根据当前激活的 Tab 获取对应的订单列表
   */
  async fetchDataForCurrentTab(isRefresh = false) {
    if (this.data.isLoading) return;
    this.setData({ isLoading: true });
    if (!isRefresh) wx.showLoading({ title: '加载中...' });

    try {
      const apiUrl = this.data.tabs[this.data.activeTab].apiUrl;
      console.log("orders.js -> fetchDataForCurrentTab -> apiUrl　==>　",apiUrl)
      const rawList = await app.request({ url: apiUrl });
      
      // 调用统一的数据处理器，为 WXML 准备好所有可直接显示的字段
      const processedList = this._processAndFormatOrderList(rawList);

      // 将处理好的列表数据，更新到 data.lists 中对应的位置
      this.setData({
        [`lists[${this.data.activeTab}]`]: processedList
      });

    } catch (err) { console.error("获取订单列表失败:", err); }
    finally {
      wx.hideLoading();
      this.setData({ isLoading: false });
      if (isRefresh) {
        wx.stopPullDownRefresh();
      }
    }
  },

  // ==========================================================
  // =                        事件处理函数                      =
  // ==========================================================

  onTabClick(e) {
    const index = e.currentTarget.dataset.index;
    if (index === this.data.activeTab) return;
    this.setData({ activeTab: index });
    this.fetchDataForCurrentTab();
  },

  onPullDownRefresh() {
    this.setData({ isRefreshing: true }); // 手动触发下拉刷新动画
    this.fetchDataForCurrentTab(true);
  },

  /**
   * [事件处理] - 用户点击卡片上的各类按钮
   * 通过 data-event 区分不同的操作类型
   */
  async onCardButtonTap(e) {
    const { event, item } = e.currentTarget.dataset;
    const id = item.id;

    switch (event) {
      case 'cancel':
        const cancelRes = await wx.showModal({ title: '确认操作', content: '您确定要取消这个预约吗？' });
        if (cancelRes.confirm) {
          wx.showLoading({ title: '正在取消...' });
          try {
            await app.request({ url: `/api/app/orders/${id}/cancel`, method: 'PATCH' });
            
            wx.showToast({ title: '取消成功' });
            this.fetchDataForCurrentTab();
          } catch (err) { console.error("取消预约失败", err); }
          finally { wx.hideLoading(); }
        }
        break;

      case 'start':
        const startRes = await wx.showModal({ title: '确认开始', content: '确定要开始使用该设备吗？系统将立即开始计时。' });
        if (startRes.confirm) {
          wx.showLoading({ title: '请稍候...' });
          try {
            await app.request({ url: `/api/app/orders/${id}/start`, method: 'POST' });
            
            wx.showToast({ title: '操作成功', icon: 'success' });
            this.setData({ activeTab: 1 });
            this.fetchDataForCurrentTab();
          } catch (err) { console.error("开始使用失败", err); }
          finally { wx.hideLoading(); }
        }
        break;
      
      case 'end':
        wx.navigateTo({ url: `/pages/usage-form/usage-form?usageRecordId=${id}&deviceName=${item.reservation.device.name}&startTime=${item.actual_start_time}` });
        break;

      case 'detail':
        if (!id) { wx.showToast({ title: '订单ID无效', icon: 'error' }); return; }
        wx.navigateTo({ url: `/pages/order-detail/order-detail?id=${id}` });
        break;
    }
  },

  // ==========================================================
  // =                     业务与辅助函数                      =
  // ==========================================================
  
  /**
   * [核心数据处理] - 统一处理和格式化订单列表
   * 它负责拼接图片URL、格式化时间、转换状态文本等所有“化妆”工作
   */
  _processAndFormatOrderList(list) {
    const baseUrl = app.globalData.config.baseUrl;
    const now = new Date();
    const currentTab = this.data.activeTab;

     // 在所有处理开始之前，根据当前Tab对列表进行预过滤
     let filteredList = list;
     switch (currentTab) {
      case 0: // 预约订单
       // 只保留状态为 'confirmed' 或 'user_cancelled' 的订单
       filteredList = list.filter(item => item.status === 'confirmed' || item.status === 'user_cancelled');
       break;
     }
     
    return filteredList.map(item => {
      // 1. 统一处理图片URL
      const device = item.device || (item.reservation && item.reservation.device);
      if (device && device.image_url) {
        // 直接修改 device.image_url, WXML中统一使用这个字段
        device.image_url = baseUrl + device.image_url;
      }
      // 2. 根据不同的Tab模式，准备不同的显示文本
      switch (currentTab) {
        case 0: // 预约订单
          item.is_overdue = item.status === 'confirmed' && new Date(item.end_time.replace('T', ' ')) < now;
          if (item.status === 'confirmed') {
            item.display_status_text = item.is_overdue ? '已超时' : '待使用';
            item.display_status_class = item.is_overdue ? 'cancelled' : 'confirmed';
          } else {
            item.display_status_text = '已取消';
            item.display_status_class = 'cancelled';
          }
          item.display_info_line_1_label = "预 约 人";
          item.display_info_line_1_value = item.contact_name;
          item.display_info_line_2_label = "预约时间";
          item.display_info_line_2_value = formatRange(item.start_time, item.end_time);
          break;
        
        case 1: // 进行中
          item.display_status_text = '进行中';
          item.display_status_class = 'ongoing';
          item.display_info_line_1_label = "预 约 人";
          item.display_info_line_1_value = item.reservation.contact_name;
          item.display_info_line_2_label = "预约时间";
          item.display_info_line_2_value = formatRange(item.reservation.start_time, item.reservation.end_time);
          item.display_info_line_3_label = "开始时间";
          item.display_info_line_3_value = formatSingle(item.actual_start_time);
          break;
          
        case 2: // 全部订单
          item.display_status_text = '已完成';
          item.display_status_class = 'completed';
          item.display_info_line_1_label = "使用时间";
          item.display_info_line_1_value = formatRange(item.actual_start_time, item.actual_end_time);
          item.display_info_line_2_label = "使用时长";
          item.display_info_line_2_value = `${item.total_minutes_used || 'N/A'} 分钟`;
          break;
      }
      return item; // 返回“化好妆”的 item
    });
  },
});